{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Bag of visual words\n",
    "\n",
    "Bag of Visual Words considers the problem of finding images of photos. Typically, we aim at finding images within a database that are similar to a given query image.\n",
    "\n",
    "One way to compare images is pixel-by-pixel. A pixel-by-pixel comparison has the disadvantage that certain types of changes such as those caused by a change in the viewpoint cannot be handled well. Furthermore, a large number of comparisons need to be executed as each pixel of the images must be compared.\n",
    "\n",
    "To not compare images pixel by pixel, we can use so-called \"visual words\" to describe images. The concept has its origins in the text retrieval community and thus the terms word and document are often used. The Bag of Visual Words concept assumes that an image can be described by a set of visual words, i.e., visual features such as SIFT descriptors. A visual word is often a \"generalized\" feature descriptor, most frequently it is a mean value of a cluster of similar visual features. We furthermore restrict the set of visual words that we will consider in the comparison to a dictionary. \n",
    "\n",
    "So, we can describe an image as a set of visual words and then aggregate the occurrences of these words in a histogram per image. By comparing these image histograms instead of the original images, we can figure out which images are visually similar. In the Bag of Visual Words notation, these are images with a small histogram difference.\n",
    "\n",
    "There is, however, a problem with this basic approach. It occurs when the visual words occur in a lot or every image of the image database. From the histogram perspective, it is impossible to distinguish which images are similar and which are not as the histograms are not very expressive. To address this problem, we can apply the so-called TF-IDF (Term Frequency - Inverse Document Frequency) reweighting approach. It computes a weight for every bin of a histogram and will downweight the \"uninformative\" words (i.e., features that occur in a lot of images/everywhere) and enhance the importance of rare words.\n",
    "\n",
    "In this notebook, we are going to look at the example of how the TF-IDF reweighting works.\n",
    "\n",
    "\n",
    "## TF-IDF weighting\n",
    "Let's assume we already have a bag of visual words for our images and we have 4 images that are represented through image histograms. In the example below, image 0 and image 3 are similar to each other. Thus, we expect the matching algorithm to report them as similar. The weight for every word in every histogram can be computed using the TF-IDF formula given by\n",
    "$$\n",
    "t_i = \\frac{n_{id}}{n_d}\\log \\frac{N}{n_i}\n",
    "$$\n",
    "where \n",
    "* $n_{id}$ - occurance of word $i$ in a document (image) $d$;\n",
    "* $n_d$ total number of words in a document $d$;\n",
    "* $n_i$ number of documents (images in the database) that contain the word $i$\n",
    "* $N$ number of documents (images in the database)\n",
    "\n",
    "![](data/bag_of_words/histograms.png)\n",
    "\n",
    "In the example above, image 0 contains 5 blue, 2 pink, 1 green, and no yellow or orange words. The image has in total 8 word occurances. With this information, we can compute the TF $\\frac{n_{id}}{n_d}=\\frac{5}{8}$.  We can observe that blue word occurs in all 4 images, whereas, for example, the yellow word occurs only in one. Thus, we can compute the overall weighting $t_i$ for all words in every histogram. We can illustrate that by:\n",
    "\n",
    "![](data/bag_of_words/ti_calculations.png)\n",
    "\n",
    "\n",
    "After reweighting the histograms, we can notice that the words that occur a lot and everywhere (blue word) gets zero weight everywhere. Interestingly, if a word occurs only once per image but in every image (green) it also get zero weights. The pink words also get more prominent in the histograms. Also just by visual inspection, it is visible more that the histograms for image 0 and image 3 are more similar after reweighting then before.\n",
    "\n",
    "![](data/bag_of_words/histogram_comparisons.png)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To be definitely confident that reweighting helps, let's look at the cost matrix. The cost matrxix is the matrix of all possible histograms comparisons (every image compared against every image). The cost matrix show on the left is obtained by comparing the histograms with Euclidean distance. The cost matrix on the right depicts  the cost matrix computed using the inverse cosine distance for reweughted histograms. Since image 0 and image 3 are similar, we expect the entries `cost_matrix[0][3]` and `cost_matrix[3][0]` to be similar to `cost_matrix[0][0]` and `cost_matrix[3][3]`. And indeed, for the reweighted histograms, this is the case. \n",
    "Note, diagonal elements of the matrices result in a distance of 0 because we are comparing identical images.\n",
    "![](data/bag_of_words/cost_matrices.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualizing cost matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "N = 4\n",
    "histograms = np.array([ [5,2,1,0,0],\n",
    "                       [4,0,1,1,0],\n",
    "                       [3,1,1,0,2],\n",
    "                       [1,2,1,0,0]])\n",
    "# Histrogram[0,:] - gets histogram for image 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def compute_cost_matrices(histograms):\n",
    "    \n",
    "    cost_matrix_eucl  = np.zeros((N,N))\n",
    "    cost_matrix_cos  = np.zeros((N,N))\n",
    "\n",
    "    for row, hist_row in enumerate(histograms):\n",
    "        for col, hist_col in enumerate(histograms):\n",
    "            eucl_dist = np.linalg.norm(hist_row-hist_col)\n",
    "            cost_matrix_eucl[row, col] = eucl_dist\n",
    "            cos_sim = np.dot(hist_row, hist_col) / (np.linalg.norm(hist_row)* np.linalg.norm(hist_col))\n",
    "            cost_matrix_cos[row, col] = cos_sim\n",
    "    return cost_matrix_eucl, cost_matrix_cos\n",
    "\n",
    "def plotCostMatrix(ax, cost_matrix, title):\n",
    "    axh = ax.imshow(cost_matrix, cmap='viridis') \n",
    "    plt.colorbar(axh, ax = ax)\n",
    "    ax.set_title(title)\n",
    "\n",
    "cm_eucl, cm_cos = compute_cost_matrices(histograms)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "weighted_hist = np.array([ [0,0.07,0,0,0],\n",
    "                           [0,0,0,0.23,0],\n",
    "                           [0,0.04,0,0,2.4],\n",
    "                           [0,0.14,0,0,0]])\n",
    "# Histrogram[0,:] - gets histogram for image 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cm_eucl, cm_cos = compute_cost_matrices(histograms)\n",
    "cm_eucl_w, cm_cos_w = compute_cost_matrices(weighted_hist)\n",
    "\n",
    "\n",
    "fig, ax = plt.subplots(1,3, figsize=(16,4));\n",
    "\n",
    "plotCostMatrix(ax[0], cm_eucl, \"Orig Euclidean\")\n",
    "plotCostMatrix(ax[1], 1- cm_cos_w, \"Reweight Inv Cosine\")\n",
    "plotCostMatrix(ax[2], cm_cos_w, \"Reweight Cosine\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It seems that reweighted histograms finds similar images outside the diagonal elements, since diagonal and corner pixels have the same color, whereas original histograms struggle to do so. Inverse Cosine distance here is $1- \\mathrm{cosineSimilarity}$ and it used to show that similar images results in low costs, since for cosine similarity the more similar the images are, the better it is."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Note on Euclidean and Cosine distance\n",
    "In previous example, we can see Euclidean distance and cosine similarity.\n",
    "Even though it seems that reweighting the histograms helps to find similar images, it is not obvious which metric to choose.\n",
    "\n",
    "Euclidean is $ \\sqrt{\\sum (x_i -y_i)^2}$\n",
    "\n",
    "Cosine is $ \\frac{x\\cdot y}{||x|| ||y||}$\n",
    "\n",
    "Inverse Cosine $ 1 -\\frac{x\\cdot y}{||x|| ||y||}$\n",
    "\n",
    "Cosine similarity is typically used to compare vectors, i.e., the angle between vectors, when the magnitude of the vector is not important. This is the case for text retrieval as well as for image retrieval in the BoW situation. So, if we normalized the histograms (thus remove the magnitude) the result should be similar for Euclidean and Cosine Similarity. It should be similar up to a constant factor. Let's see what that factor should be. \n",
    "\n",
    "Consider having vector $x$ and $y$ with unit length, then\n",
    "$$\n",
    "||x-y||^2 = (x-y)^T(x-y) = x^Tx - 2x^Ty + y^Ty \n",
    "$$\n",
    "since \n",
    "$$||x||=||y||=1$$ \n",
    "we obtain \n",
    "$$\n",
    "||x-y||^2 = 2- 2x^Ty = 2-2\\cos\\theta\n",
    "$$\n",
    "\n",
    "\n",
    "So $\\mathrm{dist\\_eucl} = \\sqrt{2 - 2\\mathrm{dist\\_cos}}$.\n",
    "\n",
    "Let's normalize original histograms such that all values have zero mean and  the norms of all vectors are equal to 1.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Normalize to lie on unit circle,hence have a unit length\n",
    "\n",
    "def normToCircle(v):\n",
    "    v_norms = np.linalg.norm(v, axis=1)\n",
    "    v_circle = v\n",
    "    v_circle = v_circle / v_norms[:,np.newaxis]\n",
    "    return v_circle\n",
    "\n",
    "# test functions for normToCircle\n",
    "v = np.array([[3,4], [-1,1], [-1,-2]])\n",
    "v_circle = normToCircle(v)\n",
    "# print(np.linalg.norm(v_circle,axis=1))\n",
    "\n",
    "v = np.array([[6,6], [2,3], [2,0]])\n",
    "v_circle = normToCircle(v)\n",
    "# print(np.linalg.norm(v_circle,axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 1. 1. 1.]\n"
     ]
    }
   ],
   "source": [
    "hist_mean = np.mean(histograms, axis=0)\n",
    "hist_norm = (histograms - hist_mean)\n",
    "hist_norm = normToCircle(hist_norm)\n",
    "\n",
    "## Checking that the norms are actually 1\n",
    "print(np.linalg.norm(hist_norm,axis=1))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we expect that the cost matrix for Euclidean distance is the same as a cost matrix for cosine similarity for the normalized histogram. We  expect cost matrix to be the same."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "squared Euclidean vs adapted cosine difference\n",
      "[[4.44089210e-16 2.22044605e-16 1.33226763e-15 4.44089210e-16]\n",
      " [2.22044605e-16 4.44089210e-16 8.88178420e-16 0.00000000e+00]\n",
      " [1.33226763e-15 8.88178420e-16 0.00000000e+00 8.88178420e-16]\n",
      " [4.44089210e-16 0.00000000e+00 8.88178420e-16 4.44089210e-16]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzIAAAHHCAYAAABk9W2uAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dfbRldX3n+feHsgQVBRVHEQqwlWSCJoKpRhzjNIlmAsRIpiU2mvYhrSFxaau9tNPGmeBDnrBXRzM2RlMJBDTGh6BtygTbkGhG7SzQggYUUFNxTACJyIMgUUmq6jt/7F16uNx76xb3d+8553ffr7X24jzsu/f3HL33U7/9/e29U1VIkiRJ0jw5YNoFSJIkSdL+ciAjSZIkae44kJEkSZI0dxzISJIkSZo7DmQkSZIkzR0HMpIkSZLmzv2mXYAk9eInfvRBdettu5tv9/Kr7/5YVZ3SfMOSpA2lt5xyICNJjdx6224+87Gjmm930+F/c1jzjUqSNpzecsqBjCQ1UsAe9ky7DEmSFtVbTnmOjCRJkqS5Y0dGkpopdlc/R7okSb3pK6fsyEiSJEmaO3ZkJKmRYe5xTbsMSZIW1VtOOZCRpIZ6OolSktSfnnLKqWWSJEmS5o4dGUlqpCh2Vz8te0lSX3rLKTsykiRJkuaOHRlJaqinkyglSf3pKaccyEhSIwXs7iggJEl96S2nnFomSZIkae7YkZGkhnpq2UuS+tNTTtmRkSRJkjR37MhIUiMFXV3WUpLUl95yyoGMJDXUz/2SJUk96imnnFomSZIkae7YkZGkRorq6rKWkqS+9JZTdmQkSZIkzR07MpLUSsHufg50SZJ601lO2ZGRJEmSNHfsyEhSI0VfV4ORJPWlt5xyICNJzYTdZNpFSJK0hL5yyqllkiRJkuaOHRlJaqSAPR2dRClJ6ktvOWVHRpIkSdLcsSMjSQ31NPdYktSfnnLKgYwkNVL0FRCSpL70llNOLZMkSZI0d+zISFJDe6qfI12SpP70lFN2ZCRpziU5KMlnklyV5Jokb1xknQOTvD/JziSXJTlm/SuVJG1Ea5VTdmQkqZEpzj2+G/ixqroryWbg00k+WlWXTqzzYuD2qnpckjOBNwP/ZhrFSpKmo7ecciAjSY0UYfcUGt1VVcBd49PN47LwTgGnA28YH18EnJsk489KkjaA3nLKqWWSNPsOS7JjYjlr4QpJNiW5ErgZuKSqLluwyhHA9QBVtQu4A3j4WhcuSdoQppJTdmQkqaE1OonylqrautwKVbUbOD7JocB/S/KEqvr8WhQjSZpfPeWUHRlJ6khVfQP4BHDKgrduBLYAJLkfcAhw6/pWJ0na6FrmlAMZSWpk70mUrZd9SfKI8QgXSR4A/DjwhQWrbQdeOD4+A/i458dI0sbSW045tUySmgm7ayrHhw4HLkyyieEA1Qeq6k+TvAnYUVXbgfOAdyfZCdwGnDmNQiVJ09RXTjmQkaQ5V1VXAycs8vrZE4+/A/zMetYlSRKsXU45kJGkRgrY44xdSdKM6i2n+vkkkiRJkjYMOzKS1NCU7pgsSdKK9JRTdmQkSZIkzR07MpLUSNXUrgYjSdI+9ZZTDmQkqaE9HbXsJUn96Smn+hmSSZIkSdow7MhIUiPDHZM9PiRJmk295VQ/n0SSJEnShmFHRpKa6eskSklSb/rKKQcyktRIb3dMliT1pbec6ueTSJIkSdow7MhIUkO7q5/LWkqS+tNTTtmRkSRJkjR37MhIUiNFurqspSSpL73llAMZSWpoT0dXg5Ek9aennOrnk0iSJEnaMOzISFIjvd0xWZLUl95yqp9PIkmSJGnDcCCjuZKkkjxuHfd3zLjP+43PP5rkhStZVxtPEXZX+0XS6iV5UZJPT7sOgCRvSPKH67zPpyX54nruU7Ont5xyILMBJfmRJH+d5I4ktyX5H0n+5bTrWq0kf5XkO0numlg+0nIfVXVqVV3YcpuSpPtu/Nt/e5ID13GfX0nyjDXc/kOS/HaSvx+z7G/H54fd121W1aeq6vtb1ilNmwOZDSbJQ4A/Bf4r8DDgCOCNwN1TqGXTGmz25VV18MTyU2uwD2lJezig+SJpcUmOAZ7GMPX/WVMtppEk9wf+Eng8cArwEOApwK3AiVMsTZ3oKadMyI3n+wCq6r1Vtbuqvl1Vf15VV8MwuEjyX5LckuTLSV62YGrVPY5CLWyPJ/njJP8wdns+meTxE+9dkOQdSS5O8o/AjyY5cNzf3yf5WpJ3JnnAxM/8xyQ3Jflqkn93Xz/0YlMKJqepJXlAkt9K8ndj7Z+erGPiZ/4qyUsW+66An1yw7iFJzhvrvzHJr+0dvCV5bJKPJ7l1/Pn3JDl04me/kuQ1Sa4e63l/koPu6+fX+qiC3XVA80XSkl4AXApcANxj2m+ShyfZnuTOJJ8BHrvg/f8nyfXj+5cnedrEe29IctH4t/ebSa5I8sTxvXcDRwEfGbslvzS+ftI42+EbSa5KcvLE9h6T5P8dt3UJsFxn5QXj9v/Pqrq2qvZU1c1V9atVdfG4vR8Y8+gbSa5J8t1BXJLTklw77uvGJK8ZXz85yQ0T6y2bM0memeTKcR9/neSHVvI/iGZbbzllQm48XwJ2J7kwyalJHrrg/Z8HngmcAGwFztjP7X8UOBb4X4ArgPcseP95wK8DDwY+DZzDMLg6HngcQ4fobIAkpwCvAX583OaatfGB/wL8MPC/MXSqfgnYs4+f2dd3dQGwi+FznQD8H8BLxvcC/CbwaOAHgC3AGxb8/HMYjsY9Bvgh4EX784EkaQN4AUPOvAf4iSSPnHjv7cB3gMOBfzcukz7LkD0PA/4I+OMFB4xOB/544v0PJ9lcVc8H/h74qbHz/5+THAH8GfBr4/qvAT6Y5BHjtv4IuJxhAPOrLBh0LfAM4L9X1V2LvZlkM/AR4M8ZsvbfA+9Jsnfa2HnAL1TVg4EnAB9fZl+L5kySE4DzgV8AHg78LrA96zh9T1oJBzIbTFXdCfwIQxv+94Cvj0es9v7xfw7w21V1fVXdxvCP7f3Z/vlV9c2qupvhH+ZPTHLIxCp/UlX/o6r2MExnOwv4D1V1W1V9E/gN4MyJWv6gqj5fVf/Ivf+hv5i3jUeP9i6/uq8fSHIAQ8C9sqpuHDtVfz1+huUs+V2N3+dpwKuq6h+r6mbgrXs/W1XtrKpLquruqvo68BbgXy38LFX11XHbH2EIXM20sGcNFkn3luRHgKOBD1TV5cDfMhws2zt1+dnA2ePf4M8D9zi/sar+sKpurapdVfVbwIHA5Dkkl1fVRVX1zwx/ow8CTlqinH8LXFxVF48dlEuAHcBpSY4C/iXwK+Pf/E8y/E1fysOBm5Z5/yTgYOCcqvqnqvo4w5Tx547v/zNwXJKHVNXtVXXFMttaKmfOAn63qi4bM/FChsxe6vNrbvSVUw5kNqCquq6qXlRVRzIcrXk08Nvj248Grp9Y/e9Wut1xqtU5GU5KvBP4yvjWZAt9ctuPAB4IXL534AH89/H1+1rLK6rq0InlV1bwM4cxBNTfrmDdScvVdzSwGbhp4rP9LsPRM5I8Msn7xrb/ncAfcu+pBv8w8fhbDMElSRq8EPjzqrplfP5HfK/T8QiGe+UtmSHjtKrrxmlV3wAOYYm8Gg++3cDwd38xRwM/M3kgjeGg4eHjz9w+HpBbtJYFbh1/bimPBq4fa5rc3hHj42czHEj7u3E621OW2dZSOXM08OoFn2cLS39+aSq8TOwGV1VfSHIBQ/sYhqNAWyZWOWrBj/wjw+Bjr0dNPH4eQyv+GQyDmEOA2+EeQ/WaeHwL8G3g8VV14yLl7auW/XGPupNM1n0Lw/SDxwJX7cc2l6vveoajV4dV1a5FfvY3GL6LH6yq25L8NHDufuxbM6jAc1qkdZDhHMbnAJuS7P3H+IHAoeO5LJ9nmNq7BfjC+P5REz//NIYpxE8HrqmqPUkW5tWWifUPAI4Evjq+NJllMPzNf3dV/fwitR4NPDTJgyYGM0ctso29/gL4tQXrT/oqsCXJARODmaMYpo5TVZ8FTh+noL0c+AD3zKqVuB749ar69f38Oc243nKqn0+iFUnyvyZ5dZIjx+dbGNrRl46rfAB4RZIjx/NnXrtgE1cCZybZnGTheSEPZvjH+60Mg4bfWK6W8Q/w7wFvTbK3U3FEkp+YqOVFSY5L8kDg9fftUwPDAOXxSY4f50C/YUEd5wNvSfLosbP0lBXMBV7yu6qqmxjmL/9WhstoHpDhBP+908ceDNwF3DHOrf6Pq/hsmiG7OaD5IulefhrYDRzHMB3qeIbzDT8FvKCqdgMfAt6Q5IFJjuOe56U8mGGg83XgfknOZrg62KQfTvKvM1zs5lUM+bY3K78G/IuJdf8Q+KkkPzFmyEHjyfVHVtXfMUwze2OS+49T4pa7oua7GQYSHxwz+4AMFy54XZLTgMsYuie/NGbxyeP23jdu/2eTHDJOibuTfZ/vuZjfA34xyZMzeFCSn0zy4PuwLc2YnnLKhNx4vgk8Gbgsw5XDLmU4cvXq8f3fAz7G8A//KxiCYNKvMHQubme4bPMfTbz3Lob29o3AtXzvD/5y/hOwE7h0nGL1F4xzlKvqowxT3j4+rrPcCYt7nZt73kfm8nFbXwLeNG7/bxguNDDpNcDnGE7+vA14M/v+/djXd/UC4P4M38XtwEV8b7rAG4EnAXcwnCC68GclSUt7IcM5lH9fVf+wd2HobP/sOPh4OcNUqX9guPjKH0z8/McYpjJ/iSG3vsM9p6EB/Anwbxj+fj8f+Nfj4ACGcyL/73Ha1Wuq6nqGGQmvYxgcXc9wgGpvjjyPIXtvYzgo966lPth4fuYzGDpJlzAMRj7DMO3tsqr6J4aBy6kMMwp+h2Hwtrfz9HzgK2Om/iLws8t8j0vVsIPhgjbnjp9/J15wRjMoVUt1NqXvXqP//wM2LzFFStLoqCc8pH7poq3Nt/vvf+ATl1dV+w1LWlSSNwCPq6p/O+1apJZ6yyk7MpIkSZLmzqpO9k/yMOD9wDEMJ3c/p6puX2S93QzTdgD+vqq6uPuuJC3kOS2zxZySpHvqKadWe9Wy1wJ/WVXnJHnt+Pw/LbLet6vKe2DMoar6CngjC2klCtjT0dVgOmFOab9V1RumXYO0FnrLqdV+ktP53g2mLmS4iogkSbPCnJKkTq22I/PI8TKzMFwV5JFLrHdQkh0Mlzo8p6o+vNhKSc5iuJssm9j0ww+815UQBXD3UQ/c90ob1JEPudeMEU146AG7p13CzLr86rtvqapH7HvN5YTdNjBnTdOcArNqpcyqpZlVyzOrFveV6/+ZW27bvcqQ6Sun9jmQSfIX3POmh3v9X5NPqqqSLHUJtKOr6sYk/wL4eJLPVdW97qJeVduAbQAPycPqyXn6Pj/ARvSl15047RJm1jlPf9+0S5hpzz74zmmXMLM2Hb5zuTtta4atZ06N2zGrVsCsWppZtTyzanEn/sTCK4RrnwOZqnrGUu8l+VqSw6vqpiSHAzcvsY0bx/9+OclfAScAiwaEJM2r3uYezwtzSpJWprecWu0n2c737pT7QoabR91DkofuvUN6ksOApzLcIFCSpLVmTklSp1Z7jsw5wAeSvJjhzrjPAUiyFfjFqnoJ8APA7ybZwzBwOqeqDAhJXepp7nEnzClJmtBTTq1qIFNVtwL3mhxcVTuAl4yP/xr4wdXsR5LmQVW6atn3wJySpO/pLaf6+SSSJEmSNozVTi2TJE3Y3dGRLklSf3rKqX4+iSRJkqQNw46MJDVSwJ6OTqKUJPWlt5xyICNJzaSrlr0kqTd95VQ/n0SSJEnShmFHRpIaGe6Y3E/LXpLUl95yyo6MJEmSpLljR0aSGtrt8SFJ0gzrKaccyEhSI0W6atlLkvrSW071MySTJEmStGHYkZGkhvZ4fEiSNMN6yql+PokkSZKkDcOOjCQ1UgW7O5p7LEnqS285ZUdGkiRJ0tyxIyNJDfV0NRhJUn96yikHMpLUyHBZSxvdkqTZ1FtO9fNJJGmDSrIlySeSXJvkmiSvXGSdk5PckeTKcTl7GrVKkjaetcopOzKS1NBuptKy3wW8uqquSPJg4PIkl1TVtQvW+1RVPXMK9UmSZkRPOWVHRpLmXFXdVFVXjI+/CVwHHDHdqiRJGqxVTtmRkaRGiumfRJnkGOAE4LJF3n5KkquArwKvqapr1rE0SdKU9ZZTDmQkqZk1O4nysCQ7Jp5vq6pt99p7cjDwQeBVVXXngrevAI6uqruSnAZ8GDh2LYqVJM2qvnLKgYwkzb5bqmrrcisk2cwQDu+pqg8tfH8yMKrq4iS/k+SwqrqlfbmSpA1mKjnlQEaSGtozhZMokwQ4D7iuqt6yxDqPAr5WVZXkRIZzJG9dxzIlSTOgp5xyICNJ8++pwPOBzyW5cnztdcBRAFX1TuAM4KVJdgHfBs6sqppGsZKkDWdNcsqBjCQ1UgW7p3ASZVV9GpY/xFZV5wLnrk9FkqRZ1FtONTnbJ8kpSb6YZGeS1y7y/oFJ3j++f9l4tQJJ6s6eOqD5otUzpyRp0FNOrXrPSTYBbwdOBY4DnpvkuAWrvRi4vaoeB7wVePNq9ytJ0kqYU5LUpxZDqBOBnVX15ar6J+B9wOkL1jkduHB8fBHw9PGkH0nqRhH2VPtFq2ZOSRL95VSLgcwRwPUTz2/g3nfq/O46VbULuAN4eIN9S5K0L+aUJHVopk72T3IWcBbAQTxwytVI0v6bxmUttb7MKknzrKecatGRuRHYMvH8yPG1RddJcj/gEBa5LnRVbauqrVW1dTMHNihNkqR2OQVmlSTNihYDmc8CxyZ5TJL7A2cC2xessx144fj4DODj3r9AUm8Kupp73BFzSpLoL6dWPbWsqnYleTnwMWATcH5VXZPkTcCOqtrOcCfPdyfZCdzGECKS1B0vlzx7zClJ+p6ecqrJOTJVdTFw8YLXzp54/B3gZ1rsS5Kk/WVOSVJ/Zupkf0maa04FkyTNss5yqp/ekiRJkqQNw46MJDVS9HVZS0lSX3rLKQcyktRQTy17SVJ/esopp5ZJkiRJmjt2ZCSpkb3X55ckaRb1llN2ZCRJkiTNHTsyktRQT0e6JEn96SmnHMhIUiNFX9fnlyT1pbeccmqZJEmSpLljR0aSGurp+vySpP70lFN2ZCRJkiTNHTsyktRK9XUSpSSpM53llB0ZSZIkSXPHjowkNdLbjcYkSX3pLaccyEhSQz0FhCSpPz3llFPLJEmSJM0dOzKS1EhvNxqTJPWlt5yyIyNJkiRp7tiRkaSGqqMjXZKk/vSUUw5kJKmhnu6YLEnqT0855dQySZIkSXPHjowkNVKd3TFZktSX3nLKjowkSZKkuWNHRpIa6ukkSklSf3rKKQcyktRMX9fnlyT1pq+ccmqZJEmSpLnTZCCT5JQkX0yyM8lrF3n/RUm+nuTKcXlJi/1K0qypSvNFq2dOSdKgp5xa9dSyJJuAtwM/DtwAfDbJ9qq6dsGq76+ql692f5Ik7Q9zSpL61OIcmROBnVX1ZYAk7wNOBxYGxH65+6gH8qXXndigvP5830s/M+0SZtb/vPLoaZcw0575oCumXULXir4ua9mRNckpMKuWY1Ytzaxanlm1uD3UqrfRW061mFp2BHD9xPMbxtcWenaSq5NclGTLYhtKclaSHUl27L7rHxuUJklSu5wCs0qSZsV6nez/EeCYqvoh4BLgwsVWqqptVbW1qrZuOvhB61SaJDVSw83GWi9aFyvKKTCrJM2xznKqxdSyG4HJI1dHjq99V1XdOvH094H/3GC/kjRz9tBPy74j5pQkjXrKqRYdmc8CxyZ5TJL7A2cC2ydXSHL4xNNnAdc12K8kSSthTklSh1bdkamqXUleDnwM2AScX1XXJHkTsKOqtgOvSPIsYBdwG/Ci1e5XkmZN0dcdk3thTknSoLecajG1jKq6GLh4wWtnTzz+ZeCXW+xLkqT9ZU5JUn+aDGQkSQDp6rKWkqTe9JVTDmQkqSGvMiZJmmU95dR6XX5ZkiRJkpqxIyNJDfV0EqUkqT895ZQdGUmSJElzx46MJDUy3OG4nyNdkqS+9JZTDmQkqaGergYjSepPTznl1DJJkiRJc8eOjCQ11NNlLSVJ/ekpp+zISJIkSZo7dmQkqaGeTqKUJPWnp5xyICNJjRTpKiAkSX3pLaecWiZJkiRp7jiQkaSGag2WfUmyJcknklyb5Jokr1xknSR5W5KdSa5O8qRVflRJ0hzqKaecWiZJ828X8OqquiLJg4HLk1xSVddOrHMqcOy4PBl4x/hfSZLW2prklAMZSWplSndMrqqbgJvGx99Mch1wBDAZEKcD76qqAi5NcmiSw8eflSRtBJ3llFPLJKkjSY4BTgAuW/DWEcD1E89vGF+TJGndtMwpOzKS1NLa3GjssCQ7Jp5vq6ptC1dKcjDwQeBVVXXnmlQiSZpvHeWUAxlJamiNWva3VNXW5VZIspkhHN5TVR9aZJUbgS0Tz48cX5MkbSA95ZRTyyRpziUJcB5wXVW9ZYnVtgMvGK8KcxJwh+fHSJLWw1rllB0ZSWqo1qZlvy9PBZ4PfC7JleNrrwOOGmqqdwIXA6cBO4FvAT83hTolSVPWU045kJGkOVdVnwaWnSswXgXmZetTkSRJ37NWOeVARpIaKaZzWUtJklait5xyICNJrRTQUUBIkjrTWU55sr8kSZKkuWNHRpIamtJJlJIkrUhPOdWkI5Pk/CQ3J/n8Eu8nyduS7ExydZIntdivJEkrYU5JUn9aTS27ADhlmfdPBY4dl7OAdzTaryTNllqDRS1cgDklSV3lVJOpZVX1ySTHLLPK6cC7xsuqXZrk0CSHezM2SX1JV1eD6Yk5JUnQW06t18n+RwDXTzy/YXxNkqRZYE5J0pyZqZP9k5zF0NJn08MOnXI1knQfOBWse2aVpLnWUU6tV0fmRmDLxPMjx9fuoaq2VdXWqtq66eAHrVNpkiStLKfArJKkWbFeA5ntwAvGq8KcBNzhvGNJ3anhjsmtF60Lc0pS/zrLqSZTy5K8FzgZOCzJDcDrgc0AVfVO4GLgNGAn8C3g51rsV5KklTCnJKk/ra5a9tx9vF/Ay1rsS5JmWkdzj3tiTknSqKOcmqmT/SVp/jkVTJI0y/rJqfU6R0aSJEmSmrEjI0ktddSylyR1qKOcsiMjSZIkae7YkZGkljo60iVJ6lBHOeVARpJaKcD7vkiSZlVnOeXUMkmSJElzx46MJDVUHbXsJUn96Smn7MhIkiRJmjt2ZCSppY6OdEmSOtRRTjmQkaSWOjqJUpLUoY5yyqllkiRJkuaOHRlJaigdtewlSf3pKafsyEiSJEmaO3ZkJKmVoquTKCVJneksp+zISJIkSZo7dmQkqZl0dTUYSVJv+sopBzKS1FJHLXtJUoc6yimnlkmSJEmaO3ZkJKmljo50SZI61FFO2ZGRJEmSNHfsyEhSSx0d6ZIkdaijnHIgI0mtFF1dDUaS1JnOcsqpZZIkSZLmjh0ZSWooHbXsJUn96Smn7MhIkiRJmjt2ZCSppY6OdEmSOtRRTjXpyCQ5P8nNST6/xPsnJ7kjyZXjcnaL/UqStBLmlCT1p1VH5gLgXOBdy6zzqap6ZqP9SZK0Py7AnJKkrjQZyFTVJ5Mc02Jbex35kNs55+nva7nJbvzPK4+edgkz67PHb5p2CTPtaX/2vGmXMMN+s8lWejqJsidrkVNgVi3HrFqaWbU8s2pxX/zWHzTZTk85tZ4n+z8lyVVJPprk8YutkOSsJDuS7Ljztl3rWJokSfvOKTCrJGlWrNfJ/lcAR1fVXUlOAz4MHLtwparaBmwDeOwPPqij8aKkDaOjG41tMCvKKTCrJM25jnJqXToyVXVnVd01Pr4Y2JzksPXYtyRJ+2JOSdL8WZeBTJJHJcn4+MRxv7eux74lad3UGi1ac+aUpA2hs5xqMrUsyXuBk4HDktwAvB7YDFBV7wTOAF6aZBfwbeDMqjKeJfXHv2wzyZySpFFHf9laXbXsuft4/1yGy15KkrTuzClJ6s96newvSRtCT5e1lCT1p6ecWs/LL0uSJElSE3ZkJKmljo50SZI61FFOOZCRpJY6CghJUoc6yimnlkmSJEmaO3ZkJKmRVF8nUUqS+tJbTtmRkSRJkjR37MhIUkuVaVcgSdLSOsopOzKS1FKtwbIPSc5PcnOSzy/x/slJ7khy5bicvZqPKEmaYx3llB0ZSZp/FzDclf5dy6zzqap65vqUI0nSPVzAGuSUAxlJamgaJ1FW1SeTHLP+e5YkzZuecsqpZZK0MTwlyVVJPprk8dMuRpKkBfY7p+zISFJLa3Ok67AkOyaeb6uqbfvx81cAR1fVXUlOAz4MHNu0QknSfOgopxzISNLsu6Wqtt7XH66qOyceX5zkd5IcVlW3tClPkrTBTSWnHMhIUiszeqOxJI8CvlZVleREhmnFt065LEnSeusspxzISFJLUwiIJO8FTmZo7d8AvB7YDFBV7wTOAF6aZBfwbeDMqprBKJMkrbmOcsqBjCTNuap67j7eP5fhspeSJK27tcopBzKS1JJ9DknSLOsop7z8siRJkqS5Y0dGkhqaxZMoJUnaq6ecsiMjSZIkae44kJEkSZI0d5xaJkktddSylyR1qKOcsiMjSZIkae7YkZGkVmb0jsmSJAHd5ZQDGUlqqaOAkCR1qKOcWvXUsiRbknwiybVJrknyykXWSZK3JdmZ5OokT1rtfiVJWglzSpL61KIjswt4dVVdkeTBwOVJLqmqayfWORU4dlyeDLxj/K8k9aWjI10dMackaa+OcmrVHZmquqmqrhgffxO4DjhiwWqnA++qwaXAoUkOX+2+JUnaF3NKkvrU9ByZJMcAJwCXLXjrCOD6iec3jK/d1HL/kjRNoa+TKHtkTknayHrLqWaXX05yMPBB4FVVded93MZZSXYk2XHnbbtalSZJUpOcGrdjVknSDGgykEmymSEc3lNVH1pklRuBLRPPjxxfu4eq2lZVW6tq60Me5gXVJM2hWoNFq9Yqp8CskjTnOsqpFlctC3AecF1VvWWJ1bYDLxivCnMScEdV2a6X1Jfx+vytF62OOSVJo85yqsWhpKcCzwc+l+TK8bXXAUcBVNU7gYuB036A/F4AABN/SURBVICdwLeAn2uwX0mSVsKckqQOrXogU1WfZjh3aLl1CnjZavclSTPPDsrMMackaUJHOdXsZH9JkiRJWi+epShJLXV0pEuS1KGOcsqBjCQ15Mn5kqRZ1lNOObVMkiRJ0tyxIyNJLXV0pEuS1KGOcsqOjCRJkqS5Y0dGklqZ8h2OJUlaVmc55UBGkhrq6SRKSVJ/esopp5ZJkiRJmjt2ZCSppY6OdEmSOtRRTtmRkSRJkjR37MhIUkM9zT2WJPWnp5yyIyNJkiRp7tiRkaSWOjrSJUnqUEc55UBGklrp7Pr8kqTOdJZTTi2TJEmSNHfsyEhSIxkXSZJmUW85ZUdGkiRJ0tyxIyNJLXU091iS1KGOcsqBjCQ11NP1+SVJ/ekpp5xaJkmSJGnu2JGRpJY6OtIlSepQRzllR0aSJEnS3LEjI0ktdXSkS5LUoY5yyoGMJLVSfZ1EKUnqTGc55dQySZIkSXPHjowktdTRkS5JUoc6yqlVd2SSbEnyiSTXJrkmySsXWefkJHckuXJczl7tfiVJWglzSpL61KIjswt4dVVdkeTBwOVJLqmqaxes96mqemaD/UnSzOpp7nFHzClJGvWUU6vuyFTVTVV1xfj4m8B1wBGr3a4kSS2YU5LUp6bnyCQ5BjgBuGyRt5+S5Crgq8BrquqaRX7+LOAsgKOOuB/PPvjOluV145kPumLaJcysp/3Z86Zdwkx76E/+zbRL6F9HR7p6tNqcGrdhVq2AWbU0s2p5ZtXiNtXdbTbUUU41G8gkORj4IPCqqlr4V/0K4OiquivJacCHgWMXbqOqtgHbALY+8aCOvmZJG0VPLfvetMgpMKskzbeecqrJ5ZeTbGYIh/dU1YcWvl9Vd1bVXePji4HNSQ5rsW9JkvbFnJKk/rS4almA84DrquotS6zzqHE9kpw47vfW1e5bkmZKrdGiVTGnJGnUWU61mFr2VOD5wOeSXDm+9jrgKICqeidwBvDSJLuAbwNnVpXxLElaD+aUJHVo1QOZqvo0kH2scy5w7mr3JUkzz3/6zhxzSpImdJRTTa9aJkkbWejrJEpJUl96y6kmJ/tLkiRJ0nqyIyNJLXV0pEuS1KGOcsqOjCRJkqS540BGkhpKVfNln/tMzk9yc5LPL/F+krwtyc4kVyd5UvMPLkmaCz3llAMZSWpletfnvwA4ZZn3T2W4S/2xwFnAO/bjU0mSetFZTjmQkaQ5V1WfBG5bZpXTgXfV4FLg0CSHr091kqSNbq1yypP9JamhGb2s5RHA9RPPbxhfu2k65UiSpqWnnHIgI0mz77AkOyaeb6uqbVOrRpKke5pKTjmQkaSW1uZI1y1VtXUVP38jsGXi+ZHja5KkjaajnPIcGUlqKNV+aWA78ILxqjAnAXdUldPKJGkD6imn7MhI0pxL8l7gZIbW/g3A64HNAFX1TuBi4DRgJ/At4OemU6kkaSNaq5xyICNJLU3hJMqqeu4+3i/gZetUjiRplnWUU04tkyRJkjR37MhIUivt5gpLktReZzllR0aSJEnS3LEjI0ktdXSkS5LUoY5yyoGMJDUS+mrZS5L60ltOObVMkiRJ0tyxIyNJLVVHh7okSf3pKKfsyEiSJEmaO3ZkJKmhnuYeS5L601NOOZCRpFaKrq4GI0nqTGc55dQySZIkSXPHjowkNZQ9065AkqSl9ZRTdmQkSZIkzZ1VD2SSHJTkM0muSnJNkjcuss6BSd6fZGeSy5Ics9r9StJMqjVYtGpmlSSNOsqpFh2Zu4Efq6onAscDpyQ5acE6LwZur6rHAW8F3txgv5I0c1LtFzVhVkkSfeXUqgcyNbhrfLp5XBZ+pNOBC8fHFwFPT5LV7luSpJUwqySpP03OkUmyKcmVwM3AJVV12YJVjgCuB6iqXcAdwMNb7FuSZkYx3DG59aImzCpJG15nOdVkIFNVu6vqeOBI4MQkT7gv20lyVpIdSXZ8/dbdLUqTJAkwqySpN02vWlZV3wA+AZyy4K0bgS0ASe4HHALcusjPb6uqrVW19REP39SyNElaFz3NPe6VWSVpI+spp1pctewRSQ4dHz8A+HHgCwtW2w68cHx8BvDxKudLSJLWh1klSf1pcUPMw4ELk2xiGBh9oKr+NMmbgB1VtR04D3h3kp3AbcCZDfYrSbPHf/bOKrNKkqCrnFr1QKaqrgZOWOT1sycefwf4mdXuS5JmWXAq2KwyqySpv5xqeo6MJEmSJK2HFlPLJEkw9ctQSpK0rM5yyo6MJEmSpLljR0aSGupp7rEkqT895ZQDGUlqqaOAkCR1qKOccmqZJEmSpLljR0aSGuqpZS9J6k9POWVHRpIkSdLcsSMjSa0UsKejQ12SpL50llMOZCSppX7yQZLUo45yyqllkiRJkuaOHRlJaqinkyglSf3pKafsyEiSJEmaO3ZkJKml6uhQlySpPx3llB0ZSZIkSXPHjowkNdTT3GNJUn96yikHMpLUStHVZS0lSZ3pLKecWiZJkiRp7tiRkaRGAqSjkyglSX3pLafsyEiSJEmaO3ZkJKmlPdMuQJKkZXSUUw5kJKmhnlr2kqT+9JRTTi2TJEmSNHfsyEhSK51d1lKS1JnOcsqOjCRJkqS5Y0dGkpop6GjusSSpN33llAMZSWoo/eSDJKlDPeXUqqeWJTkoyWeSXJXkmiRvXGSdFyX5epIrx+Ulq92vJEkrYU5JUp9adGTuBn6squ5Kshn4dJKPVtWlC9Z7f1W9vMH+JGl2ddSy74g5JUl7dZRTqx7IVFUBd41PN49LP9+QJGmumVOS1Kcm58gk2QRcDjwOeHtVXbbIas9O8r8DXwL+Q1Vdv8h2zgLOGp/evenwnZ9vUV8jhwG3TLuI0SzVAjNVz2/OUC3ATH03wGzVM0u1AHz/qrdQkI7umNyTVjk1bmtWs2rWfqdmqZ5ZqoUZy6pZqgVmq55ZqgXMqXtpMpCpqt3A8UkOBf5bkidU1eQf9o8A762qu5P8AnAh8GOLbGcbsA0gyY6q2tqivhZmqZ5ZqgVmq55ZqgWsZzmzVAsM9Uy7Bq2dVjk1bmsms2qWaoHZqmeWaoHZqmeWaoHZqmeWagFzajFN7yNTVd8APgGcsuD1W6vq7vHp7wM/3HK/kjQzqtovasackrThdZRTLa5a9ojxCBdJHgD8OPCFBescPvH0WcB1q92vJM2kWoNFq2JOSdKEjnKqxdSyw4ELx/nHBwAfqKo/TfImYEdVbQdekeRZwC7gNuBFK9jutga1tTRL9cxSLTBb9cxSLWA9y5mlWmD26lE7a5VTMFv/v5mlWmC26pmlWmC26pmlWmC26pmlWmD26pm6lNMWJKmJhxx8RJ30g7/YfLuXXHr25bM0T1uSNJ96y6mm58hIkqYjySlJvphkZ5LXLvK+N3yUJE3NWuRUk6uWSZJGU+hyj1Om3s5w7scNwGeTbK+qaxes6g0fJWmj6yinZqYjk+RhSS5J8jfjfx+6xHq7J0Zq29egjn2NFg9M8v7x/cuSHNO6hv2oZd2OsCY5P8nNSRa9X0IGbxtrvTrJk9aqlhXWc3KSOya+m7PXsJYtST6R5Nok1yR55SLrrMv3s8Ja1vO7OSjJZ5JcNdbzxkXWWZffqRXWsrrfqQL2rMGybycCO6vqy1X1T8D7gNP3q3atyCxklTm1ZC3m1NK1mFNL12NOzXFOzcxABngt8JdVdSzwl+PzxXy7qo4fl2e1LCDfGy2eChwHPDfJcQtWezFwe1U9Dngr8OaWNexnLTCMXPd+H7+/FrWMLmDB5UoXOBU4dlzOAt6xhrWspB6AT018N29aw1p2Aa+uquOAk4CXLfK/1Xp9PyupBdbvu7kb+LGqeiJwPHBKkpMWrLMuv1MrrAXW73dqfxyWZMfEctaC948AJm/eeMP42kLPHv+BclGSLWtWbd+mmlXm1LIuwJxaijm1NHOqjank1CwNZE5nuAEZ439/ego1rGS0OFnnRcDTk2RKtaybqvokw5V8lnI68K4aXAocmnteznS961k3VXVTVV0xPv4mw2VbF/5yrsv3s8Ja1s34ee8an24el4U97XX5nVphLasSilT7BbilqrZOLPflyjUfAY6pqh8CLuF737n2z7Szypxagjm1NHNq2XrMqTnOqVkayDyyqm4aH/8D8Mgl1jtoHOldmqR1gKxktPjddapqF3AH8PDGday0FpidI6wrrXc9PWVsz340yePXY4dju/kE4LIFb63797NMLbCO302STUmuBG4GLqmqJb+bNf6dWkktMDu/U/vjRmCy1iPH176rvOFjK9POKnPqvjOnMKeWqMOcWntrklPrOpBJ8hdJPr/Ico8jOFW13O11jq7h8m7PA347yWPXuu4Z5hHWpV3B8P+VJwL/FfjwWu8wycHAB4FXVdWda72/VdSyrt9NVe2uquMZ/midmOQJa7m/Vday+t+p6dwx+bPAsUkek+T+wJnAPc7LiDd8XDGzqilzamnmlDl1X2oxpyas60Cmqp5RVU9YZPkT4Gt7P8D435uX2MaN43+/DPwVw0i+lX2OFifXSXI/4BDg1oY1rLiWGTvCupLvbt1U1Z1727NVdTGwOclha7W/JJsZ/iC/p6o+tMgq6/b97KuW9f5uJvb7DeAT3HvO+Hr9Tu2zlia/U1MIiPEI4cuBjzH84f9AVV2T5E0ZbvIIww0fr0lyFfAKVn7Dxw1nxrPKnLrvzClzalnm1Pzl1CxNLdsOvHB8/ELgTxaukOShSQ4cHx8GPBVYeNm21djnaHFBnWcAHx+PyrU2b0dYtwMvyOAk4I6J6RfrLsmj9s5fTXIiw//X1+SPzrif84DrquotS6y2Lt/PSmpZ5+/mEUkOHR8/gOGyi19YsNq6/E6tpJYZ+53aL1V1cVV9X1U9tqp+fXzt7BruWk9V/XJVPb6qnlhVP1pVC/930MpMO6vMqfvOnDKnFtuXObVO1iKnZuk+MucAH0jyYuDvgOcAJNkK/GJVvQT4AeB3k+xh+D/1OXXv60/fZ1W1K8ne0eIm4Py9o0Vgx/hFnwe8O8lOhpP4zmy1//tQyyvGUeyusZYXrUUtAEneC5zMcFWKG4DXM5yERlW9E7gYOA3YCXwL+Lm1qmWF9ZwBvDTJLuDbwJlrFOQw/CPl+cDnMsxrBXgdcNREPev1/ayklvX8bg4HLsxwdaMDGI7A/Ok0fqdWWMvqfqf2XtZSPZtqVplTSzOnlmVOLc2cmmNZu/9fSNLGcsgDH10nff/PN9/un1/5pstrON9CkqT7rLecmqWOjCTNvXhwSJI0w3rKqVk6R0aSJEmSVsSOjCS11NGRLklShzrKKQcyktTMiq+nL0nSFPSVU04tkyRJkjR37MhIUitFV0e6JEmd6Syn7MhIkiRJmjt2ZCSppY5uNCZJ6lBHOeVARpIa6un6/JKk/vSUU04tkyRJkjR37MhIUksdHemSJHWoo5yyIyNJkiRp7tiRkaRWCtjTz5EuSVJnOsspBzKS1Exfd0yWJPWmr5xyapkkSZKkuWNHRpJa6uhIlySpQx3llB0ZSZIkSXPHjowktdTRkS5JUoc6yik7MpIkSZLmjh0ZSWqls8taSpI601lOOZCRpGYKas+0i5AkaQl95ZRTyyRJkiTNHTsyktRSRydRSpI61FFO2ZGRJEmSNHfsyEhSK52dRClJ6kxnOeVARpJa6qhlL0nqUEc55dQySZIkSXPHjowktdTRkS5JUoc6yik7MpIkSZLmjh0ZSWqmujrSJUnqTV855UBGklopYE8/d0yWJHWms5xyapkkSZKkuWNHRpJa6qhlL0nqUEc5ZUdGkiRJ0tyxIyNJLXV0pEuS1KGOcsqOjCRJkqS5Y0dGkpop2NPPkS5JUm/6yikHMpLUSkFVP5e1lCR1prOccmqZJEmSpLljR0aSWuqoZS9J6lBHOWVHRpIkSdLcsSMjSS11dFlLSVKHOsopBzKS1EoV7OnnJEpJUmc6yymnlkmSJEmaO3ZkJKmljlr2kqQOdZRTdmQkSZIkzR07MpLUUHU091iS1J+ecsqBjCQ1U1217CVJvekrp5xaJkmSJGnu2JGRpFaKru6YLEnqTGc5ZUdGkiRJ0tyxIyNJLVU/J1FKkjrUUU7ZkZEkSZI0d+zISFIjBVRHc48lSX3pLaccyEhSK1VdtewlSZ3pLKecWiZJHUhySpIvJtmZ5LWLvH9gkveP71+W5Jj1r1KStFGtRU45kJGkhmpPNV/2Jckm4O3AqcBxwHOTHLdgtRcDt1fV44C3Am9u/NElSXOgp5xyICNJ8+9EYGdVfbmq/gl4H3D6gnVOBy4cH18EPD1J1rFGSdLGtSY55TkyktTSdOYeHwFcP/H8BuDJS61TVbuS3AE8HLhlXSqUJM2GjnLKgYwkNfJNbv/YX9RFh63Bpg9KsmPi+baq2rYG+5Ekday3nHIgI0mNVNUpU9r1jcCWiedHjq8tts4NSe4HHALcuj7lSZJmQW855TkykjT/Pgscm+QxSe4PnAlsX7DOduCF4+MzgI9XVT83E5AkzbI1ySk7MpI058a5xC8HPgZsAs6vqmuSvAnYUVXbgfOAdyfZCdzGECKSJK25tcqpeEBOkiRJ0rxxapkkSZKkueNARpIkSdLccSAjSZIkae44kJEkSZI0dxzISJIkSZo7DmQkSZIkzR0HMpIkSZLmjgMZSZIkSXPn/wfuXNQp8VsRZAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cm_eucl, cm_cos = compute_cost_matrices(histograms)\n",
    "cm_eucl_norm, cm_cos_norm = compute_cost_matrices(hist_norm)\n",
    "cm_eucl_w, cm_cos_w = compute_cost_matrices(weighted_hist)\n",
    "\n",
    "print(\"squared Euclidean vs adapted cosine difference\")\n",
    "print(np.fabs(cm_eucl_norm**2 - (2 - 2*cm_cos_norm)))\n",
    "\n",
    "\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14,8))\n",
    "\n",
    "plotCostMatrix(ax1, cm_eucl_norm**2, \"Squared Euclidean\")\n",
    "plotCostMatrix(ax2, 2 - 2*cm_cos_norm, \"Adapted Cosine\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OK, they are the same :smile:\n",
    "But the question stays, what to use Cosine or Euclidean for reweighted histograms?\n",
    "Let visualize everything "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "hwm = np.mean(weighted_hist, axis=0)\n",
    "hist_weigh_norm = (weighted_hist - hwm)\n",
    "hist_weigh_norm = normToCircle(hist_weigh_norm)\n",
    "\n",
    "cm_eucl_w_norm, cm_cos_w_norm = compute_cost_matrices(hist_weigh_norm)\n",
    "\n",
    "fig, axs = plt.subplots(2, 4, figsize=(14,8))\n",
    "\n",
    "plotCostMatrix(axs[0][0], cm_eucl, \"Orig Euclidean\")\n",
    "plotCostMatrix(axs[1][0], cm_cos, \"Orig Inv Cosine\")\n",
    "\n",
    "plotCostMatrix(axs[0][1], cm_eucl_norm, \"Norm Eucl\")\n",
    "plotCostMatrix(axs[1][1], cm_cos_norm, \"Norm Cosine\")\n",
    "\n",
    "plotCostMatrix(axs[0][2], cm_eucl_w, \"Reweight Eucl\")\n",
    "plotCostMatrix(axs[1][2], cm_cos_w, \"Reweight Cosine\")\n",
    "\n",
    "plotCostMatrix(axs[0][3], cm_eucl_w_norm, \"Reweight Norm Eucl\")\n",
    "plotCostMatrix(axs[1][3], cm_cos_w_norm, \"Reweight Norm Cosine\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, what do we see?\n",
    "Basically, the only result which is feasable for us is **Reweight Cosine**, since it is the only one that shows similar costs on the diagonals as well as for upper right and lower left matrix entry. And this is what we wanted to have.\n",
    "\n",
    "It also seems that further normalization of reweighted histograms (Reweight Norm Eucl/Cosine) is showing some non-sense. So, not going to do that.\n",
    "\n",
    "That's it for now!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
